﻿//----------------------------------------------------------------
// Desc: 世界管理器
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2012-04-04
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


//----------------------------------------------------------------
// 世界对象类型
//----------------------------------------------------------------
enum EF_FWD_OBJECT_TYPE
{
    // 对象的基类类型（主用于属于集区分，不会创建实体）
    eFWD_OT_UNKNOWN,
    eFWD_OT_OBJECT = eFWD_OT_UNKNOWN,
    eFWD_OT_2D_OBJECT,
    eFWD_OT_3D_OBJECT,

    // 特殊对象类型（有实体）
    eFWD_OT_SCENE = 5,              // 基本类型，小于此类型为运行时类型，大于此类型为实际场景节点类型

    // 2D（有实体）
    eFWD_OT_CANVAS,
    eFWD_OT_2D_PNG,
    eFWD_OT_2D_JPG,
    eFWD_OT_2D_DDS,
    eFWD_OT_FSD_SPRITE,
    eFWD_OT_FSD_GROUP,
    eFWD_OT_FSD_PARTICLE,
    eFWD_OT_GROUND,
    eFWD_OT_GRID_TILE,
    eFWD_OT_2D_SOUND,

    // 3D（有实体）
    eFWD_OT_TERRAIN,
    eFWD_OT_LIGHT_DOT,
    eFWD_OT_LIGHT_SUN,
    eFWD_OT_SKYBOX,
    eFWD_OT_3D_SOUND,

    // MAX
    eFWD_OT_TYPE_MAX,

    EF_FWD_OBJECT_TYPE_FORCE = 0x7fff
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
struct FWD_RES_BIND;
struct FWD_RES_BIND_DRAW;
class IFWodResFactory : public IFMemObject
{
public:
    // 渲染时需要动态创建绑定资源时调用
    virtual bool CreateResBind(IFEngine* f, FWD_RES_BIND_DRAW& rbw, FWD_RES_BIND* frb) = 0;
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class IFWodObject : public IFMemObject
{
public:
    // 是否是场景对象
    virtual bool IsScene() = 0;
    // 是否是画布对象
    virtual bool IsCanvas() = 0;
    // 是否是地皮对象
    virtual bool IsGround() = 0;
    // 是否是网格地块对象
    virtual bool IsGridTile() = 0;
    // 是否是特定类型对象（测试完成以后即可转换为指定类型数据）
    // .t 见EF_FWD_OBJECT_TYPE
    virtual bool IsType(WORD t) = 0;
    // 设置对象可见状态
    virtual void SetVisible(bool vl) = 0;
    // 此对象目前是否可见
    // 注意：如果此对象的父对象不可见，那么此值返回为可见，但实际不可见
    virtual bool IsVisible() = 0;
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class IFWodScene : public IFMemObject
{
public:
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class IFWodFsdParticle : public IFMemObject
{
public:
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class IFWodGridObject : public IFMemObject
{
public:
    // 测试此对象的资源类型（EF_FWD_OBJECT_TYPE）
    // 注意：资源类型只可能是PNG\JPG\DDS\FSD\FMD，不可能是如画布、场景、地形等对象
    // 当知道本类型或者预先在编辑器就设计好本对象的类型，那么可以直接调用后面的类型GET接口了
    virtual WORD ResType() = 0;
    // 当ResType返回为PNG\JPG\DDS图片格式时返回值有效
    virtual IFTextureFile* GetTex(IFEngine* f) = 0;
    // 当ResType返回为FSD时，并且绑定的就是精灵对象时返回值有效
    virtual IFSpriteObject* GetSpr(IFEngine* f) = 0;
    // 当ResType返回为FSD时，并且绑定的就是精灵组时返回值有效
    virtual IFSpriteGroup* GetSprGroup(IFEngine* f) = 0;
};
typedef FVector< IFWodGridObject* > FV_WOD_GRID_OBJECTS;
class IFWodGridTile : public IFMemObject
{
public:
    // 取得指定格子上面的对象（临时容器，不能保存为全局或者成员变量）
    virtual void GetGird(POINT& pt, FV_WOD_GRID_OBJECTS& wgos) = 0;
};